#pragma once

#include <iostream>
#include <assert.h>
using namespace std;

class Data
{
public:
	//构造函数
	Data(int y = 1, int m = 1, int d = 1):_year(y),_month(m),_day(d)
	{
		assert(CheckDay());
	}

	//析构函数
	~Data()
	{
		_year = 0;
		_month = 0;
		_day = 0;
	}

	//拷贝构造函数
	Data(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	//赋值运算符重载函数
	Data& operator=(const Data& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;

		return *this;
	}

	void Show()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

	//因为该函数需要多次使用，所以直接定义在类中，称为内联函数
	int GetMonthDay(int year, int month)
	{
		static int day[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)))
		{
			//day[month] += 1;
			return 29;
		}
		return day[month];
	}

	//运算符重载
	//1.日期加整数(原日期改变)
	Data& operator+=(int day);

	//2.日期加整数(原日期不变)
	Data operator+ (int day);
	
	//3.日期减整数(原日期改变)
	Data& operator-=(int day);

	//4.日期减整数(原日期不变)
	Data operator-(int day);

	//5.日期减日期
	friend int operator-(const Data& d1, const Data& d2);

	//6.日期比较
	friend bool operator>(const Data& d1, const Data& d2);
	friend bool operator>=(const Data& d1, const Data& d2);
	friend bool operator<(const Data& d1, const Data& d2);
	friend bool operator<=(const Data& d1, const Data& d2);
	friend bool operator==(const Data& d1, const Data& d2);

	//7.日期自增
	//d++
	Data operator++(int);
	//++d
	Data& operator++();

	//8.日期自减
	//d--
	Data operator--(int);
	//--d
	Data& operator--();

	//9.流插入流提取
	friend istream& operator>>(istream& input, Data& d);
	friend ostream& operator<<(ostream& output, const Data& d);

	bool CheckDay();
private:
	int _year;
	int _month;
	int _day;
};


